#ifndef __INKLUDE_IK_C_STRING_H__
#define __INKLUDE_IK_C_STRING_H__

#include <Inklude/Inklude.h>
#include <string>

namespace Inklude
{

class INKLUDE_CLASS_EXPORT ikCString
{
public:
    ikCString() {}
    ~ikCString();
    ikCString(std::string&   _String);
    ikCString(std::wstring&  _String);
    ikCString(const char*    _String);
    ikCString(const wchar_t* _String);

    const char*    c_str();
    const wchar_t* c_wstr();

#ifndef UNICODE
    const char* c_tstr();
#else
    const wchar_t* c_tstr();
#endif

    std::string&   ToString();
    std::wstring&  ToWString();

    bool operator== (Inklude::ikCString& _String);
    bool operator== (std::string& _String);
    bool operator== (std::wstring& _String);
    bool operator== (char* _String);
    bool operator== (wchar_t* _String);

    void operator= (const Inklude::ikCString _String);
    void operator= (const std::string& _String);
    void operator= (const std::wstring& _String);
    void operator= (const char* _String);
    void operator= (const wchar_t* _String);
    void operator= (const int value);
    void operator= (const float value);

    void Assign(const Inklude::ikCString _String);
    void Assign(const std::string& _String);
    void Assign(const std::wstring& _String);
    void Assign(const char* _String);
    void Assign(const wchar_t* _String);
    void Assign(const int value);
    void Assign(const float value);

    ikCString operator+ (Inklude::ikCString _String);
    ikCString operator+ (std::string& _String);
    ikCString operator+ (std::wstring& _String);
    ikCString operator+ (char* _String);
    ikCString operator+ (wchar_t* _String);

    unsigned int Length();

    void Clear();

    static wchar_t* CharToWChar(const char* _String);
    static char*    WCharToChar(const wchar_t* _String);
    static wchar_t* Inverse(const wchar_t* _String);
    static char*    Inverse(const char* _String);

    int ToInt();
    float ToFloat();


protected:

private:
    std::string  m_string;
    std::wstring m_wstring;
};

}

#endif // __INKLUDE_C_STRING_H__

